package 其他.猿辅导;

import MyUtils.MHUtils;
import org.junit.Test;

public class 嵌套箱子解码后总数2 {
    // String S = "()(()(())2)3()10"; // 20
//    String S = "()(()()()()2)3"; // 1 + 3(3+2) = 16
    // String S = "()()((()3()2)2)2"; // 28 -> 2 x
    String S;
    {
        S="()" ;//v
        S="()()";//v
        S="()()()((()2)())3"; //x
        S="()()(()2)3";//x
    }

    @Test
    public void test() {
        System.out.println(bT(0,S.length()));
    }

    int e=0;
    private int bT(int lt, int rt) {
        MHUtils.debug_digui(e++, String.format("lt=%s, rt=%s",lt,rt));
        if(lt>=rt){
            MHUtils.debug_digui(--e, "return 1");
            return 1;
        }

        char[] s = S.substring(lt,rt).toCharArray();
        int l=0,L=0,R=0,res=0;

        for (int r = 0; r < s.length; ) {
            if(s[r]=='('){
                L++;
                r++;
            }
            else if(s[r]==')'){
                R++;
                r++;
                if(L==R){ // debug看 个数 LR 核心
                    int num = 0;
                    int old_r = r; // 跳数字前的

                    while(r<s.length && s[r]>='0' && s[r]<='9'){
                        num = num*10 + s[r]-'0'; // debug 直接到 s[r]=='2' 出错位置
                        r++;
                    }
                    if(num==0){
                        num = 1;
                    }

                    // int son = bT(l + 1,  old_r-1); // debug时 提出来 好看值
                    res += bT(l + 1,  old_r-1) * num;
                    l=r;
                    L=0;R=0;
                }
            }
            else if(s[r]>='0' && s[r]<='9'){ // 内数字 不管
                r++;
                continue;
            }
        }
        MHUtils.debug_digui(--e, "return "+res);
        return res;
    }


    /*
     纯净版
     */
    private int bT2(int lt, int rt) {
        if(lt>=rt){
            return 1;
        }

        char[] s = S.substring(lt,rt).toCharArray();
        int l=0,L=0,R=0,res=0;

        for (int r = 0; r < s.length; ) {
            if(s[r]=='('){
                L++;
                r++;
            }
            else if(s[r]==')'){
                R++;
                r++;
                if(L==R){
                    int num = 0;
                    int old_r = r;

                    while(r<s.length && s[r]>='0' && s[r]<='9'){
                        num = num*10 + s[r]-'0';
                        r++;
                    }
                    if(num==0){
                        num = 1;
                    }

                    res += bT2(l + 1,  old_r-1) * num;

                    l=r;L=0;R=0;
                }
            }
            else if(s[r]>='0' && s[r]<='9'){
                r++;
                continue;
            }
        }
        return res;
    }
}
